//********************************************************************
//	created:	14:2:2012   18:04
//	filename: 	epollsocketmanager.h
//	author:		tiamo
//	purpose:	epoll socket manager
//********************************************************************

#pragma once

#ifndef WIN32
namespace network
{
	//
	// epoll socket manager
	//
	class EpollSocketManager : public SocketManager
	{
	public:
		//
		// constructor
		//
		EpollSocketManager(utils::Event& stopEv) : SocketManager(stopEv)	{}

		//
		// destructor
		//
		virtual ~EpollSocketManager()										{}

	private:
		//
		// start
		//
		virtual void start(utils::Config* config);

		//
		// shutdown
		//
		virtual void shutdown();

		//
		// poll network event
		//
		virtual void pollNetworkEvent(uint32_t pollTimeout);

		//
		// add socket
		//
		virtual bool onAddSocket(utils::SmartPointer<AsyncSocket> const& theSocket);

		//
		// remove socket
		//
		virtual void onRemoveSocket(utils::SmartPointer<AsyncSocket> const& theSocket);

		//
		// build event set
		//
		std::vector<std::pair<utils::SmartPointer<AsyncSocket>, int>> buildEventSet(struct epoll_event* eventBuffer, int eventCount);

	private:
		//
		// epoll file
		//
		int																	mPollFile;

		//
		// event buffer
		//
		utils::DataBuffer													mEventBuffer;
	};
}
#endif
